/*
 * @Author: ouyanglongjiao
 * @LastEditors: ouyanglongjiao
 * @LastEditTime: 2022-08-31 15:00:11
 * @Description: 播放器 通用配置、函数
 */
import { random14 } from '@/util/util.js'
import { getVideoPlayInfo } from '@/api/armyScreenApi.js'
// import { localTimeToIsoTime } from '@hui-pro/utils'
import { ccWrapper, SimplePlayerConfig, crashOccurPromise } from 'client-container' // AUTO_ZINDEX_ELEMENT
import { useDateFormat } from '@vueuse/core'
function localTimeToIsoTime (dateStr) {
  const dateObj = new Date(dateStr)
  const result = useDateFormat(dateObj, 'YYYY-MM-DDTHH:mm:ss.000+08:00')
  // 2019-11-15T00:00:00.000+08:00
  return result
}
export default {
  data () {
    return {
      playerExist: true, // 播放器创建销毁
      playerId: 'SimplePlayer_' + random14(), // 播放器 element id
      indexCode: '', // 设备ID，取自 cameraData.indexCode || cameraData.cameraIndexCode
      loadStatus: 1001, // 1001正在加载，0成功，其它失败
      bindPolicy: 0, // AUTO_ZINDEX_ELEMENT
      configData: {
        /* 平台配置 */
        strProtocol: '', // 平台协议
        strPlatIp: '', // 平台IP
        strPlatPort: '', // 平台端口
        strToken: '', // token
        strAuthorization: '', // Authorization
        iMultiRouteId: 0, // 多线路Id
        strPlatLanguage: 'zh_CN', // 平台语言 zh_CN
        bUseSac: true, // true/false 回放是否需要从sac查询
        bUseUnivice: false, // 是否过univice
        /* 水印配置 */
        strUserName: 'admin', // 用户名
        bShowName: false, // 是否显示用户名
        bShowIP: false, // 是否显示IP
        bShowMac: false, // 是否显示Mac
        /* 是否开启硬解 gpu解码 */
        bGpuEnable: false,
        /* 是否开启差错隐藏 0 1 2 3, 0不开启 */
        iErrConcealEnable: 0,
        /* 是否需要截图回调 */
        bGetSnap: true,
        /* 界面显示配置 */
        bShowCalendar: true, /* 回放轴是否需要显示日历按钮 */
        bShowDownload: false /* 回放轴是否需要显示下载器按钮 */
      },
      voice: true, // 声音控制
      full: false, // 全屏控制
      // 默认工具栏配置
      defaultTools: {
        full: true,
        voice: true,
        close: false
      },
      tools: null
    }
  },
  props: {
    /** 设备数据
     * @param {String} cameraData.indexCode 设备ID
     * @param {String} cameraData.cameraName 设备名称
     * */
    cameraData: {
      type: Object,
      default: () => null
    },
    /** 播放器顶部工具栏
     * @param {Boolean} playerTools.full 展示全屏按钮，默认为true
     * @param {Boolean} playerTools.voice 展示声音按钮，默认为true
     * @param {Boolean} playerTools.close 展示关闭按钮，默认为false  --> 适用于窗口模式, 触发playerCloseEmit(index)
     * */
    playerTools: {
      type: Object,
      default: () => null
    },
    // 播放器索引，用于多窗口播放
    playerIndex: {
      type: Number,
      default: () => 0
    }
  },
  created: async function () {
    // 设备ID
    if (this.cameraData) {
      this.indexCode = this.cameraData.cameraIndexCode || this.cameraData.indexCode
    } else {
      console.log('>>>>>>>>>> 设备信息（cameraData）为空：', this.cameraData)
    }
    // 顶部工具栏配置
    if (this.playerTools) {
      this.tools = {}
      Object.assign(this.tools, this.defaultTools, this.playerTools)
    }
    await crashOccurPromise
  },
  methods: {
    // **************** 视频初始化    流程： 加载完成 -> 获取视频参数配置 -> 完成配置 (-> 预览 | ?)
    // 播放器加载结果  & 加载完成后 立即预览
    onLoadResult (player, errCode, data) {
      this.loadStatus = errCode
      if (errCode === 0) {
        // 加载成功
        console.log('SimplePlayer load success')
        this.$nextTick(() => {
          this.getVideoConfig() // 获取视频参数配置
        })
      } else {
        console.log('SimplePlayer load failed errCode: ' + errCode + ', content: ', data)
      }
    },
    // 获取视频参数配置
    getVideoConfig () {
      getVideoPlayInfo().then(res => {
        if (res?.data) {
          const dataConfig = Object.assign({}, this.configData, {
            // isAutoZIndex: false,
            strProtocol: res.data.protocol, // https
            strPlatIp: res.data.platIp, // '10.192.195.201'
            strPlatPort: res.data.platePort, // '443'
            strToken: res.data.strToken, // 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzcyI6InhhdXRoLWF1dG...'
            strPlatLanguage: res.data.language, // 'zh_CN'
            iMultiRouteId: res.data.imultiRouteId // 1
          })
          this.commonConfig(dataConfig)
        }
      })
    },
    // 初始化播放器
    commonConfig (dataConfig) {
      SimplePlayerConfig(dataConfig)
      console.log('>>>>>>>>>> playerCompleteCB：', dataConfig)
      // 配置完成
      // do something
      this.playerIsReady()
    },
    // 待定
    onNotify (player, msg) {
      console.log(msg)
      if (msg && msg.fromMethod === 'snapShot' && msg.code === 0) {
        if (msg && msg.picBase64) {
          // this.uploadImage(msg.picBase64)
        }
      }
      // if (msg && msg.type === 'doubleclick') {
      //   // 双击事件
      // }
    },

    // **************** 视频API
    /**
     * @summary 【预览】根据监控点信息进行预览
     */
    playerPlayReal () {
      if (this.$refs[this.playerId]) {
        const params = {}
        params.strIndexcode = this.indexCode // 监控点编号
        params.transmode = 1 // 取流方式 0 UDP 1 TCP
        params.streamType = 0 // 0主码流 1子码流
        params.isSmallEagleEyeAbility = 0 // 是否是小鹰眼设备 0不是 1是
        params.streamDispatchMode = 0 // 转流方式由vnsc返回
        console.log('params', params)
        this.$refs[this.playerId].startPlayReal(params)
      }
    },
    /**
     * @summary 【预览】停止
     */
    playerStopPlayReal () {
      if (this.$refs[this.playerId]) {
        this.$refs[this.playerId].doClear({})
      }
    },
    /**
     * @summary 【回放】根据监控点信息及开始结束时间进行查询并回放
     * @param {Object} _params 回放参数
     */
    playerPlayBack (params) {
      if (this.$refs[this.playerId]) {
        const _params = {}
        const _queryParams = {} /* 回放请求体参数 */
        _queryParams.indexCode = this.indexCode
        // _queryParams.indexCode = 'e8eb709323d74b97b2397202c0077bf5'
        // _queryParams.recordStyle = 0
        _queryParams.recordStyle = params.recordStyle ?? 0 /* 传0是查询中心存储  传1是查询设备存储 */
        _queryParams.recordType = '0|1|2|6' // '0|1|2|6' /* 录像类型 传空查询全部录像片段 "0|1|2|6" 0定时录像 1移动侦测 2报警触发 6手动录像 */
        _queryParams.transmode = 1 /* 0 UDP 1 TCP */
        _queryParams.streamType = 0 /* 0主码流 1子码流 */
        /* ISO带时区格式时间 2019-11-15T00:00:00.000+08:00   formatDate */
        _queryParams.startTime = localTimeToIsoTime(params.startTime) // '2021-03-16T00:00:00.000+08:00' yyyy-MM-dd HH:mm:ss SSS
        _queryParams.endTime = localTimeToIsoTime(params.endTime)
        _queryParams.playTime = params.playTime ? localTimeToIsoTime(params.playTime) : localTimeToIsoTime(params.startTime) // playTime字段用于指定一开始从哪个时间点开始播放
        _params.strRecordParam = _queryParams
        _params.bShowBottomFunc = true // 底部进度条
        _params.bShowDownload = false // 是否需要显示下载录像片段入口
        // console.log('>>>>>>>>>> playerPlayBack _params：', _params)
        this.$refs[this.playerId].startPlayBack(_params)
        // console.log('playerPlayBack reslut: ' + JSON.stringify(res))
      }
    },
    /**
     * @summary 【回放】停止
     */
    playerStopPlayBack () {
      if (this.$refs[this.playerId]) {
        this.$refs[this.playerId].stopPlayBack({})
      }
    },
    /**
     * @summary 【回放】暂停、恢复
     */
    playerPause (bPause) {
      if (this.$refs[this.playerId]) {
        const params = {}
        params.bPause = bPause /* true暂停 false恢复 */
        this.$refs[this.playerId].pause(params)
      }
    },
    /**
     * @summary 【截图】完成后触发 onNotify -> picBase64
     */
    playerSnapShot () {
      if (this.$refs[this.playerId]) {
        const params = {}
        params.strCameraName = this.cameraData?.cameraName || 'cameraName' // 换成需要保存的截图名称
        params.isSmallEagleEyeAbility = 0 // 是否是小鹰眼设备 默认0不是 1是
        this.$refs[this.playerId].snapShot(params)
      }
    },
    /**
     * @summary 【录像】紧急录像接口  完成后触发 onNotify
     */
    playerRealRecord (bOpen) {
      if (this.$refs[this.playerId]) {
        const params = {}
        params.strCameraName = this.cameraData?.cameraName || 'cameraName' // 换成需要保存的录像名称
        params.strRecordPath = 'D:/record' // 换成保存录像的路径
        params.iSaveMode = 0 // 0是正常切片模式 1是设置最大值关闭
        params.bOpen = bOpen // true开始  false结束
        this.$refs[this.playerId].realRecord(params)
      }
    },
    /**
     * @summary 3D放大
     * @param {Boolean} bStart true开始3d放大 false结束3d放大
     */
    playerPtz3DZoom (bStart) {
      if (this.$refs[this.playerId]) {
        const params = {}
        params.bStart = bStart // true进入  false结束
        this.$refs[this.playerId].ptz3DZoom(params)
      }
    },
    /**
     * @summary 电子放大接口
     */
    playerDigitalZoom (bStart) {
      if (this.$refs[this.playerId]) {
        const params = {}
        params.bStart = bStart // true进入电子放大模式  false退出电子放大模式
        this.$refs[this.playerId].digitalZoom(params)
      }
    },
    /**
     * @summary 声音控制
     */
    playerVoice () {
      if (this.loadStatus !== 0) { return false }
      if (this.$refs[this.playerId]) {
        this.$refs[this.playerId].sound({
          bOpen: !this.voice
        })
        this.voice = !this.voice
        // this.$refs[this.playerId].$setExist(false)
      }
    },

    // **************** 视频操作/业务逻辑
    // 全屏
    playerFullEvent () {
      this.full = !this.full
    },
    // 关闭（按钮）视频框事件Emit
    playerCloseEvent () {
      this.$emit('playerCloseEmit', this.playerIndex)
    },
    // 点击视频框事件Emit
    playerClickEvent () {
      this.$emit('playerClickEmit', this.playerIndex)
    }
  },
  beforeUnmount () {
    // 销毁播放器
    if (this.$refs[this.playerId]) {
      // 不再暴露销毁播放器接口，删除播放器绑定元素后自动调用销毁
      this.playerExist = false
      ccWrapper.ccUpdateAllWindow()
    }
  }
}
